﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stddef.h>
//typedef struct S
//{
//	char a;
//	int b;
//	char c;
//}s;
//main()
//{
//	printf("%d %d %d\n", offsetof(s,a), offsetof(s, b), offsetof(s, c));
//}
// 
//写一个宏，计算结构体中某变量相对于首地址的偏移
//typedef struct S
//{
//	char a;
//	int b;
//	char c;
//}s;
//#define OFFSETOF(type, member) (size_t)&(((type*)0)->member)
//int main()
//{
//	printf("%d %d %d\n", OFFSETOF(s, a), OFFSETOF(s, b), OFFSETOF(s, c));
//}

//写一个宏，可以将一个整数的二进制位的奇数位和偶数位交换
//#define SWAP(n)    (n=((n&0xaaaaaaaa)>>1)+((n&0x55555555)<<1))
//int main()
//{
//	int a = 13;
//	//二进制为1101
//	printf("%d\n", a);
//	SWAP(a);
//	//1110=14
//	printf("%d\n", a);
//}

//int firstUniqChar(char* str)
//{
//    //用一个数组来记录每个字符出现的位置，因为是字符，ascii码值不会超过128
//    int count[128] = { 0 };
//    int len = strlen(str);
//    int i = 0;
//    for (i = 0; i < len; i++)
//    {
//        count[(int)(str[i])]++;
//    }
//    //找第⼀次出现，并且出现次数为1的字⺟
//    for (i = 0; i < len; i++)
//    {
//        if (count[(int)str[i]] == 1)
//        {
//            return i;
//        }
//    }
//    return -1;
//}
//
////在⼀个字符串中找到第⼀个只出现⼀次的字符,并返回它的位置,如果没有则返回-1(需要区分⼤⼩写)
//int main() {
//    printf("%d\n", firstUniqChar("leetcode"));      // 输出 0（字符 'l'）
//    printf("%d\n", firstUniqChar("loveleetcode"));   // 输出 2（字符 'v'）
//    printf("%d\n", firstUniqChar("aabb"));           // 输出 -1
//    printf("%d\n", firstUniqChar("aA"));             // 输出 0（区分大小写）
//    return 0;
//}
//合并两个有序的数组
#include <stdlib.h>
#include <string.h>
//int compare(const* p1,const* p2)
//{
//	return *((int*)p1) - *((int*)p2);
//}
//void merge(int* arr1, int* arr2, int n1, int n2)
//{
//	memcpy(arr1 + n1, arr2, n2 * sizeof(int));
//	qsort(arr1, n1 + n2, sizeof(int), compare);
//}
//int main()
//{
//	int arr1[20] = { 2,4,5,7,8 };
//	int arr2[] = { 1,3,5,8,10 };
//	int n1 = 5;
//	int n2 = 5;
//	merge(arr1, arr2, n1, n2);
//	for (int i = 0; i < n1 + n2; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}

//void merge_two_pointers(int* arr1, int* arr2, int n1, int n2) {
//    int* tmp = malloc((n1 + n2) * sizeof(int));
//    int i = 0, j = 0, k = 0;
//    while (i < n1 && j < n2) {
//        tmp[k++] = (arr1[i] < arr2[j]) ? arr1[i++] : arr2[j++];
//    }
//    while (i < n1) tmp[k++] = arr1[i++];
//    while (j < n2) tmp[k++] = arr2[j++];
//    memcpy(arr1, tmp, (n1 + n2) * sizeof(int));
//    free(tmp);
//    tmp = NULL;
//}
//
//int main() {
//    int arr1[10] = { 2,4,5,7,8 }; // 提前预留足够空间
//    int arr2[] = { 1,3,5,8,10 };
//    int n1 = 5, n2 = 5;
//
//    // merge_qsort(arr1, arr2, n1, n2);
//    merge_two_pointers(arr1, arr2, n1, n2);
//
//    for (int i = 0; i < n1 + n2; i++) {
//        printf("%d ", arr1[i]);
//    }
//    return 0;
//}

